'''
功能清单：
获取个人详情---get---user/
修改个人详情---put---user/
个人头像上传---post---upload/avatar/
修改个人擅长技术---put---user/label/
修改个人密码---put---user/password/
获取个人回答过的问题---get---user/
获取个人提问的问题---get---user/
获取个人关注的标签---get---user/
'''

# 获取个人中心详情
from rest_framework.generics import RetrieveUpdateAPIView, UpdateAPIView, CreateAPIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView

from backend.apps.user.models import User
from backend.apps.user.serializers import UserDetailSerializer, UserLabelSerializer, UserPwdSerializer,CreateUserSerializer


# 用户模块--注册登录
class UserCreateView(CreateAPIView):
    """
    用户注册
    """
    serializer_class = CreateUserSerializer

# 个人中心详情页获取---查询只用到get方法,但是在查询个人中心的时候必须要要求用户是登录状态，所以选用RetrieveUpdateAPIView子视图
class UserDetailView(RetrieveUpdateAPIView):
    '''
    个人中心获取个人详情接口文档
    请求方式：get
    请求路径：user/
    请求参数：
    请求头传参 用户登录成功之后保存的token
    响应：
    id              int--user表
    username        str--user表
    mobile          null
    realname        null
    birthday        null
    sex             int
    acatar          null
    website         null
    email           str
    city            null
    address         null
    labels=[]           ---问答模块中的标签表
    questions=[]        ---问答模块中的问题表
    answer_question=[]   ---回答问题
    collected_articles=[]---头条模块中的文章表
    enterpises=[id(int),name(str),labels(str),logo(str),recruits=[number=[int]]---招聘模块中的职位表,summary(str)]---招聘模块中的企业表

    '''
    # 1.指定我们使用的序列化器
    serializer_class = UserDetailSerializer
    # 2.需要设置仅通过验证登录的用户使用
    permission_classes = [IsAuthenticated]
    # 3.重写get_object方法---需要获取到提问回答的数据不在user表中，需要重写get_object方法根据用户id找中间表得到用户有关的回答，问题表数据，在遍历出来问题添加到回答问题的响应参数中
    def get_object(self):
        # 获取到请求参数中的user
        user = self.request.user
        # 根据user找到回答的所有对象--关联数据库中的Reply模型类
        replies = user.replies.all()
        # 定义用户回答问题的返回参数为列表
        user.answer_question = []
        # 遍历上面得到回答对象
        for item in replies:
            # 判断每一个对象的type字段是不是等于2，如果是就是回答过的
            if item.type == 2:
                # 添加到返回参数回答问题列表中
                user.answer_question.append(item)
        return user
# 个人中心修改个人信息
'''
修改个人信息接口文档：
请求方式：put
请求路径：user/
请求参数：
请求头         json格式和token
请求体
realname        string
sex             number 
birthday        string 
website         string 
mobile          string 
email           string 
city            string 
address         string 
avatar          string
响应：
id              number 
username        string 
mobile          string 
realname        string 
birthday        string 
sex             number 
avatar          string 
website         string 
email           string 
city            string 
address         string 
labels          object
questions       object
answer_question object
collected_articles  object
enterpises      object
个人中心响应参数需要涉及到的表在各个模块里,再细分化响应参数中的对象参数需要的参数---便于我们写序列化器
①labels：
id          int
label_name  str
②questions：---问答模块的问题表
id          int
createtime  str
labels      str[]
reply       int
replyname   str---null
replytime   str---null
title       str
unuseful_count  int
useful_count    int
user        str
visits      int
③answer_question:---回答问题的一个中间表，关联的表（user，问题表，回答表）
id          int
content     str
createtime  str
useful_count    int
problem     int
subs        object
user        object
parent      null
③①subs
id          int
content     str
createtime  str
useful_count   int
unuseful_count  int
③①②user
id          int
username    str
avatar      str
③②user
id      int
username    str
avatar      str
④collected_articles---文章表（user（文章））
id      int
title   str
content str
createtime  str
user    obj
collected_users int
collected   bool
image   str
④①user
id  int
username    str
avatar  str
articles    obj
fans    int
④①①articles
id  int
title   str
⑤enterpises-----企业表
id          int
name        str
labels      str
logo        str
recruits    int
summary     str   

'''
class UserLabelView(UpdateAPIView):
    permission_classes = [IsAuthenticated]
    serializer_class = UserLabelSerializer
    # 1.序列化器中进行反序列化保存修改的信息---明文信息不需要重写
    # 2.序列化返回self.request.user
    def get_object(self):
        return self.request.user
'''
修改密码接口文档
请求方式:put
请求路径：user/password/
请求参数：
请求头            token和Content-Type（json）
响应：
password    string
'''
# 个人中心修改密码
class UserPwdView(UpdateAPIView):
    permission_classes = [IsAuthenticated]
    serializer_class = UserPwdSerializer
    # 1.序列化器中进行反序列化保存修改的信息
    # 2.序列化返回self.request.user
    def get_object(self):
        return self.request.user
# 个人中心关注和取消关注
'''
关注接口文档
    请求方式：post
    请求路径：user/like/{id}/
    请求参数：
            id                   必传         路径
    Content-Type     form        必传        请求头
    Authorization    JWTtoken    必传        请求头
    响应：
    message             string 
    success             boolean     
'''
class UserLikeView(APIView):
    permission_classes = [IsAuthenticated]
    def post(self, request, userid):
        user = self.request.user
        idol = User.objects.get(id=userid)
        if idol in user.idols.all():
            return Response({"success": False, "message": "请不要重复关注"}, status=400)
        user.idols.add(idol)
        user.save()
        return Response({"success": True, "message": "关注成功"})
    '''
    取消关注接口文档
    请求方式：delete
    请求路径：user/like/{id}/
    请求参数：
            id                   必传         路径
    Content-Type     form        必传        请求头
    Authorization    JWTtoken    必传        请求头
    响应：
    message             string 
    success             boolean                     
    '''
    def delete(self, request, userid):
        user = self.request.user
        idol = User.objects.get(id=userid)
        if idol not in user.idols.all():
            return Response({"success": False, "message": "请不要重复取消关注"}, status=400)
        user.idols.remove(idol)
        user.save()
        return Response({"success": True, "message": "取消关注成功"})




